package com.nuaa.yupicturebackend.config;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;

/**
 * 包装请求，使 InputStream 可以重复读取  
 *  
 * @author pine  
 */  
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
  
    private final String body;  
  
    public RequestWrapper(HttpServletRequest request) {
        super(request);  
        StringBuilder stringBuilder = new StringBuilder();  
        try (InputStream inputStream = request.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
            char[] charBuffer = new char[128];  
            int bytesRead = -1;  
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {  
                stringBuilder.append(charBuffer, 0, bytesRead);  
            }  
        } catch (IOException ignored) {
        }  
        body = stringBuilder.toString();  
    }  
  
    @Override  
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        return new ServletInputStream() {  
            @Override  
            public boolean isFinished() {  
                return false;  
            }  
  
            @Override  
            public boolean isReady() {  
                return false;  
            }  
  
            @Override  
            public void setReadListener(ReadListener readListener) {
            }  
  
            @Override  
            public int read() throws IOException {  
                return byteArrayInputStream.read();  
            }  
        };  
  
    }  
  
    @Override  
    public BufferedReader getReader() throws IOException {  
        return new BufferedReader(new InputStreamReader(this.getInputStream()));  
    }  
  
    public String getBody() {  
        return this.body;  
    }  
  
}
